package com.xwm93up.basic.lambdatips.comparator;

import com.xwm93up.basic.lambdatips.UserBean;

import java.util.*;
import java.util.stream.Collectors;

public class UniqueElementList {

    /**
     * 利用HashMap的key去重
     *
     * @param userBeanList 用户列表
     * @return 去重后列表
     */
    public static List<UserBean> handleRepeatByHashMap(List<UserBean> userBeanList) {
        if (null == userBeanList || userBeanList.size() == 0) {
            return  userBeanList;
        }
        List<UserBean> list = new ArrayList<>();
        HashMap<String, UserBean> userBeanHashMap = new HashMap<>();
        userBeanList.forEach(e -> userBeanHashMap.put(e.getName(), e));
        userBeanHashMap.forEach((e, userBean) -> list.add(userBean));
        return list;
    }

    /**
     * Tree:有序 Set:唯一 TreeSet:有序且唯一
     *
     * @param userBeanList 用户列表
     * @return 去重之后的列表
     */
    public static List<UserBean> handleRepeatByTreeSet(List<UserBean> userBeanList) {
        if (null != userBeanList && userBeanList.size() > 0) {
            TreeSet<UserBean> set = new TreeSet<>(new Comparator<UserBean>() {
                @Override
                public int compare(UserBean o1, UserBean o2) {
                    // 按照name属性
                    return o1.getName().compareTo(o2.getName());
                }
            });
            set.addAll(userBeanList);
            return new ArrayList<>(set);
        }
        return userBeanList;
    }

    /**
     * 方法一:利用Stream流和TreeSet去重
     * 方法二:利用Stream流和LinkedHashMap去重
     *
     * @param userBeanList 用户列表
     * @return 去重之后的列表
     */
    public static List<UserBean> handleRepeatByStream(List<UserBean> userBeanList) {
        if (null == userBeanList || userBeanList.size() == 0) {
            return  userBeanList;
        }
        // 第一种写法: TreeSet
        /*return userBeanList
                .stream()
                .collect(
                        Collectors.collectingAndThen(
                                Collectors.toCollection(
                                        () -> new TreeSet<>(
                                                Comparator.comparing(UserBean::getName)
                                        )
                                ),
                                ArrayList::new
                        )
                );*/
        // 第二种写法: LinkedHashMap
        return new ArrayList<>(
                userBeanList
                        .stream()
                        .collect(
                                Collectors.toMap(
                                        UserBean::getName,
                                        user -> user,
                                        (existing, replacement) -> existing, //选择保留第一个遇到的元素
                                        LinkedHashMap::new
                                )
                )
                .values()
        );
    }

}
